package com.xy.webadmin.app.dto;

import com.xy.common.core.validator.UpdateGroup;
import com.xy.common.core.validator.ConstDictRef;
import com.xy.application.common.constant.YesOrNo;

import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;

import jakarta.validation.constraints.*;

import java.util.Date;

/**
 * MQTT终端配置Dto对象。
 *
 * @author xiaoyue
 * @date 2025-05-13
 */
@Schema(description = "MQTT终端配置Dto对象")
@Data
public class MqttBrokerConfigDto {

    /**
     * 主键。
     */
    @Schema(description = "主键。", requiredMode = Schema.RequiredMode.REQUIRED)
    @NotNull(message = "数据验证失败，主键不能为空！", groups = {UpdateGroup.class})
    private Long id;

    /**
     * 配置名称。
     */
    @Schema(description = "配置名称。", requiredMode = Schema.RequiredMode.REQUIRED)
    @NotBlank(message = "数据验证失败，配置名称不能为空！")
    private String name;

    /**
     * 终端控制台地址。
     */
    @Schema(description = "终端控制台地址。", requiredMode = Schema.RequiredMode.REQUIRED)
    @NotBlank(message = "数据验证失败，终端控制台地址不能为空！")
    private String brokerUrl;

    /**
     * 客户端ID。
     */
    @Schema(description = "客户端ID。", requiredMode = Schema.RequiredMode.REQUIRED)
    @NotBlank(message = "数据验证失败，客户端ID不能为空！")
    private String clientId;

    /**
     * 认证用户名。
     */
    @Schema(description = "认证用户名。", requiredMode = Schema.RequiredMode.REQUIRED)
    @NotBlank(message = "数据验证失败，认证用户名不能为空！")
    private String username;

    /**
     * 认证密码。
     */
    @Schema(description = "认证密码。", requiredMode = Schema.RequiredMode.REQUIRED)
    @NotBlank(message = "数据验证失败，认证密码不能为空！")
    private String password;

    /**
     * 是否清除会话：0保留/1清除。
     */
    @Schema(description = "是否清除会话：0保留/1清除。")
    @ConstDictRef(constDictClass = YesOrNo.class, message = "数据验证失败，是否清除会话：0保留/1清除为无效值！")
    private Integer cleanSession;

    /**
     * 心跳间隔。
     */
    @Schema(description = "心跳间隔。")
    private Integer keepalive;

    /**
     * 连接超时时间（秒）。
     */
    @Schema(description = "连接超时时间（秒）。")
    private Integer connectionTimeout;

    /**
     * 最大未确认消息数。
     */
    @Schema(description = "最大未确认消息数。")
    private Integer maxInflight;

    /**
     * 否自动重连：0否/1是。
     */
    @Schema(description = "否自动重连：0否/1是。")
    @ConstDictRef(constDictClass = YesOrNo.class, message = "数据验证失败，否自动重连：0否/1是为无效值！")
    private Integer autoReconnect;

    /**
     * 是否启用TLS：0否/1是。
     */
    @Schema(description = "是否启用TLS：0否/1是。")
    @ConstDictRef(constDictClass = YesOrNo.class, message = "数据验证失败，是否启用TLS：0否/1是为无效值！")
    private Integer sslEnabled;

    /**
     * CA证书路径。
     */
    @Schema(description = "CA证书路径。")
    private String caCertPath;

    /**
     * 客户端证书路径。
     */
    @Schema(description = "客户端证书路径。")
    private String clientCertPath;

    /**
     * 客户端私钥路径。
     */
    @Schema(description = "客户端私钥路径。")
    private String clientKeyPath;

    /**
     * 私钥密码。
     */
    @Schema(description = "私钥密码。")
    private String keyPassword;

    /**
     * 遗嘱消息主题。
     */
    @Schema(description = "遗嘱消息主题。")
    private String willTopic;

    /**
     * 遗嘱消息内容。
     */
    @Schema(description = "遗嘱消息内容。")
    private String willPayload;

    /**
     * 遗嘱消息QoS：0/1/2。
     */
    @Schema(description = "遗嘱消息QoS：0/1/2。")
    private Integer willQos;

    /**
     * 遗嘱是否保留：0否/1是。
     */
    @Schema(description = "遗嘱是否保留：0否/1是。")
    @ConstDictRef(constDictClass = YesOrNo.class, message = "数据验证失败，遗嘱是否保留：0否/1是为无效值！")
    private Integer willRetain;

    /**
     * MQTT协议版本（3.1/3.1.1/5.0）。
     */
    @Schema(description = "MQTT协议版本（3.1/3.1.1/5.0）。")
    private String protocolVersion;

    /**
     * 默认QoS等级：0/1/2。
     */
    @Schema(description = "默认QoS等级：0/1/2。")
    private Integer qosLevel;

    /**
     * 环境标识（dev/test/prod）。
     */
    @Schema(description = "环境标识（dev/test/prod）。")
    private String environment;

    /**
     * 配置描述。
     */
    @Schema(description = "配置描述。")
    private String description;

    /**
     * 公司。
     * NOTE: 可支持等于操作符的列表数据过滤。
     */
    @Schema(description = "公司。可支持等于操作符的列表数据过滤。")
    private Long companyId;

    /**
     * 创建时间。
     */
    @Schema(description = "创建时间。")
    private Date createTime;
}
